package pers.karl.design.basic.strategy.usage.context;

import pers.karl.design.basic.strategy.PriceStrategy;
import pers.karl.design.basic.strategy.impl.PriceDiscountStrategy;

import java.math.BigDecimal;

/**
 * 与模板方法模式类似，公共的执行步骤，
 *     优点：比模板方法模式更加灵活，采用的组合而不是继承
 *     缺点：调用者不仅知道实现类、还会知道这一层的存在。
 *  @author karl
 */
public class StrategyContext {

    private PriceStrategy PriceStrategy;

    public StrategyContext(PriceStrategy PriceStrategy) {
        this.PriceStrategy = PriceStrategy;
    }

    /**
     * 业务方法，即相同的执行步骤
     *
     * @param price
     * @return
     */
    public BigDecimal getPrice(BigDecimal price) {
        // 记录日志等


        return PriceStrategy.calcPrice(price);
    }

}
